一、微信支付
微信具体支付方式
- 刷卡支付
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景, 一般出现在商场上。
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
Ø ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
Ø ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
Ø ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
- 扫码支付
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
- APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP调起微信支付模块完成支付的模式。
生成二维码
项目中引入qrcode.js,可快速生成二维码
<html>
<head>
<!-- 1. 导入js文件 -->
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/qrcode.js"></script>
</head>
<body>
<!-- 2. 提供一个div用于显示二维码 -->
<div style="text-align:center" id="qrcode"></div>
</body>
<!-- 3.使用qrcode.js制作二维码 -->
<script type="text/javascript">
var qr=qrcode(10,'H'); //提供两个参数, 第一个参数用来设置图片大小(1-10), 浏览器只能支持3~10
//第二个参数用来设置容错级别 L(7%) M(15%) Q(25%) H(35%)
qr.addData("http://www.itcast.cn"); //往二维码中存储一个url地址
qr.make(); //生成二维码
$("#qrcode").html(qr.createImgTag()); //显示二维码
</script>
</html>代码实现微信扫码支付
相关概念:
appid:微信公众账号或开放平台APP的唯一标识
partner:商户号 (配置文件中的partner)
partnerkey:商户密钥
sign:数字签名, 根据微信官方提供的密钥和一套算法生成的一个加密信息, 就是为了保证交易的安全性
认证流程
微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
申请步骤:(了解)
第一步:注册公众号(类型须为:服务号)
请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类型。
第二步:认证公众号
公众号认证后才可申请微信支付,认证费:300元/次。
第三步:提交资料申请微信支付
登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。
第四步:开户成功,登录商户平台进行验证
资料审核通过后,请登录联系人邮箱查收商户号和密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证。
第五步:在线签署协议
本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效
第六步:查看自己的公众号信息

微信sdk
微信sdk方法
// 获取随机字符串
WXPayUtil.generateNonceStr();
// Map转换为xml字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
// XML字符串转换为MAP
WXPayUtil.xmlToMap(result)代码示例
生成支付信息
// 调用微信后台接口,将数据返回,前端根据 返回数据的code_url生成二维码
try {
//1 获取用户的请求参数
String pname = request.getParameter("pname"); // 商品的名称
String price = request.getParameter("price"); //要支付的金额
//2 编写商户的信息
Map<String, String> param = new HashMap<String, String>();
param.put("appid", PayConfig.appid);// 公众号id
param.put("mch_id", PayConfig.partner); //商户的账号
param.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
param.put("body", pname); //商品描述
String orderId = WXPayUtil.generateNonceStr(); // 订单号
param.put("out_trade_no", orderId);
param.put("total_fee", price); // 支付的金额 , 单位是分
param.put("spbill_create_ip", "127.0.0.1"); // ip地址
param.put("notify_url", PayConfig.notifyurl); //通知地址
param.put("trade_type", "NATIVE"); //交易类型
//3 生成数字签名, 同时把上面的参数都编写成xml格式的数据
String xml = WXPayUtil.generateSignedXml(param, PayConfig.partnerkey);
//4 把这些信息发送给微信支付后台
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
HttpClient client = new HttpClient(url);
client.setHttps(true);//开启https协议
client.setXmlParam(xml);//设置xml格式的数据
client.post();//发送请求
//5 获取微信支付后台返回的数据
String content = client.getContent();
Map<String,String> resultMap = WXPayUtil.xmlToMap(content);//把返回的数据转换成map集合
resultMap.put("orderId", orderId);
resultMap.put("money", price);
//6 把map集合转换成json格式的数据,然后写出
Gson gson = new Gson();
String json = gson.toJson(resultMap);
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(json);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}查询支付状态
try {
response.setContentType("text/json;charset=utf-8");
//1 获取用户的请求参数,订单号
String orderId = request.getParameter("orderId");
//2 填写商户信息
Map<String, String> param = new HashMap<String, String>();
param.put("appid", PayConfig.appid); // 公众号的唯一标识
param.put("mch_id", PayConfig.partner); //商户的账号
param.put("out_trade_no",orderId); // 订单号
param.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
//3 数字签名与把上面参数写成xml格式
String xml = WXPayUtil.generateSignedXml(param, PayConfig.partnerkey);
//4 把信息发送给微信支付后台
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
client.setHttps(true);
client.setXmlParam(xml);
long startTime = System.currentTimeMillis(); //定义一个变量记录开始发送请求的时间
while(true){
//发送请求
client.post();
//5 获取微信支付的返回值
String content = client.getContent();
//把xml转换map对象
Map<String,String> resultMap = WXPayUtil.xmlToMap(content);
//把map转换成json向页面输出
Gson gson = new Gson();
String json = gson.toJson(resultMap);
//情况一:用户已经支付
if("success".equalsIgnoreCase(resultMap.get("trade_state"))){
response.getWriter().write(json); // trade_state=success
break;
}
//情况2: 超过30秒用户还是没有支付
if(System.currentTimeMillis()-startTime>30000){
response.getWriter().write(json); // trade_state=NOTPAY
break;
}
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}